<?php


class SvcProgrammationConnected extends SvcProgrammation {
    
    
    protected static $title='Programmation';
    protected static $bodyCssClass='prog connect';
    
    
    public static function verifier(){
        //si on a des données, c'est qu'une action est demandée
        if(count($_POST)>0){
            //si on a l'ID, c'est qu'on veut le supprimer
            if(isset($_POST['PROG_NUMID'])){
                if(Programmation::remove($_POST['PROG_NUMID'])){
                    Message::info('Suppression réalisée avec succès');
                }
                else{
                    Message::error("La suppression n'a pas fonctionné");
                }
            }
            //sinon, c'est une création
            else{
                Message::debug("Nouvelle programmation");
                $prog=new Programmation();
                $prog->populate($_POST);
                $prog->setDate(self::getDateForNewProg());
                if($prog->save()){
                    Message::info('Enregistrement réalisé avec succès');
                }
                else{
                    Message::error("L'enregistrement n'a pas fonctionné");
                }
            }
        }
    }

    /**
     * Recherche la date pour la programmation que l'on essaie d'enregistrer
     */
    private static function getDateForNewProg(){
        $creneau=Creneau::load($_POST['CREN_NUMID']);
        $semaine=Navig::getSemaineSelectionnee();
        //on fait un gros décalage car la semaine commence le dimanche en base
        $jrsem=$creneau->CREN_JRSEM!=0?$creneau->CREN_JRSEM-1:6;
        $dateChoisie=Date::ajouterJours($semaine['debut'],$jrsem);
        return Date::timestampToPattern($dateChoisie);
    }

    
    
    
    
    

    public static function construire(){
        $semaine=Navig::getSemaineSelectionnee();
        $joursClos=Date::getJoursClos($semaine);
        $creneaux=Creneau::loadAll();
        
        $programmation=array(
            'jours'=>array(),
            'horaires'=>self::getHoraires($creneaux)
        );
        
        $debut=$programmation['horaires']['debut']*60;
        $duree=$programmation['horaires']['fin']*60-$debut+120; //+120 car on compte aussi la durée du dernier segment
        
        //la programmation est sur 7 jours
        for($i=1;$i<=7;$i++){
            $date=Date::ajouterJours($semaine['debut'],$i-1);
            $progDuJour=array();
            $progDuJour['label']=Date::timestampToDateFR($date,false,true,false,false);
            $progDuJour['court']=Date::timestampToPattern($date,'d/m');
            $progDuJour['ferme']=Date::isDateInList($date,$joursClos);
            $progDuJour['today']=Date::isToday($date);
            $progDuJour['creneaux']=array();
            
            if(!$progDuJour['ferme']){
                foreach($programmation['horaires']['creneaux'] as $creneauUtilisable){
                    if($creneauUtilisable->CREN_JRSEM==($i<7?$i:0)){
                        $debutCreneauPourcentage=($creneauUtilisable->CREN_HEURE-$debut)/$duree;
                        $progDuJour['creneaux'][]=array(
                            'id'=>$creneauUtilisable->CREN_NUMID,
                            'top'=>$debutCreneauPourcentage*100,
                            'heure'=>$creneauUtilisable->CREN_HEURE,
                            'progs'=>Programmation::getProgsForThisMoment($date,$creneauUtilisable)
                        );
                    }
                }
            }
            
            $programmation['jours'][date('Y-m-d',$date)]=$progDuJour;
        }
        Javascript::addFileScript('adm_prog.js',true);
        echo(Navig::getWeekPanel());
        include('php/page/programmeConnected.php');
    }
    
    
    /**
     * Retourne la plage horaire à afficher en fonction des créneaux présents
     **/
    private static function getHoraires($creneaux){
        /***
         * Dans cette fonction, toutes les notions d'heures sont manipulées en minutes
         * pour simplifier les calculs. En revanche, le retour donne un affichage en heure.
        ***/
        
        //les heures limites :
        $horaireMin=6*60; //6h du mat
        $horaireMax=24*60; //minuit max pour le commencement du dernier film
        
        //la plage minimale par défaut :
        $horaireDebut=14*60; //on affiche pas moins que la 
        $horaireFin=14*60; //plage entre 14h et 18h (car il faut compter les +4h)
        
        $creneauAffichables=array();
        foreach($creneaux as $creneau){
            //si le créneau est entre les heures min et max
            if($horaireMin<$creneau->CREN_HEURE && $creneau->CREN_HEURE<$horaireMax){
                //si c'est plus tôt
                if($creneau->CREN_HEURE<$horaireDebut){
                    //on change l'heure de début
                    $horaireDebut=$creneau->CREN_HEURE;
                }
                //si c'est plus tard
                if($horaireFin<$creneau->CREN_HEURE){
                    //on change l'heure de fin
                    $horaireFin=$creneau->CREN_HEURE;
                }
                $creneauAffichables[]=$creneau;
            }
        }
        
        //Maintenant il faut calculer des segments de 2 heures qui interviennent sur la plage.
        //Cela permettra d'afficher la colonne de gauche du tableau de programmation.
        $heures=array();
        $debut=null;
        $fin=null;
        for($i=0;$i<24;$i+=2){
            $heureCalculee=$i*60;
            if(($horaireDebut-120)<$heureCalculee && $heureCalculee<($horaireFin+120)){
                if($debut==null) $debut=$i;
                $heures[]=$i.'h00';
                $fin=$i;
            }
        }
        //Pour finir, on ajoute 2 segments de 2h pour prendre en compte la durée des films (max 4h)
        $heures[]=(($fin+=2)%24).'h00';
        $heures[]=(($fin+=2)%24).'h00';
        
        return array(
            'debut'=>$debut,
            'fin'=>$fin,
            'heures'=>$heures,
            'creneaux'=>$creneauAffichables
        );
    }
    
    
}


?>